package cn.flying.cloud.base.mybatis.interceptor;//package cn.flying.cloud.mybatis.interceptor;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.InvocationTargetException;
//import java.sql.Connection;
//import java.sql.SQLException;
//import java.time.LocalDateTime;
//import java.util.Date;
//import java.util.Properties;
//
//import org.apache.commons.beanutils.BeanUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.executor.statement.StatementHandler;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.mapping.SqlCommandType;
//import org.apache.ibatis.session.ResultHandler;
//import org.apache.ibatis.session.RowBounds;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
//
//import cn.flying.cloud.common.constants.Constants;
//import cn.flying.cloud.common.utils.SnowflakeUtil;
//import cn.flying.cloud.common.utils.ThreadLocalUtil;
//
///**
// *  审计字段填充拦截器（针对sql拼接的情况mp默认fill方式不能处理的情况的补充）
// * @author: admin
// * @date: 2024年02月05日 21:49
// * @version: 1.0
// */
//public class AuditInfoFillInterceptor implements InnerInterceptor {
//    private final Logger logger = LoggerFactory.getLogger(this.getClass());
//
//    /**
//     * 判断是否执行 {@link Executor#query(MappedStatement, Object, RowBounds, ResultHandler, CacheKey, BoundSql)}
//     * <p>
//     * 如果不执行query操作,则返回 {@link Collections#emptyList()}
//     *
//     * @param executor      Executor(可能是代理对象)
//     * @param ms            MappedStatement
//     * @param parameter     parameter
//     * @param rowBounds     rowBounds
//     * @param resultHandler resultHandler
//     * @param boundSql      boundSql
//     * @return 新的 boundSql
//     */
//    @Override
//    public boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
//        return InnerInterceptor.super.willDoQuery(executor, ms, parameter, rowBounds, resultHandler, boundSql);
//    }
//
//    /**
//     * {@link Executor#query(MappedStatement, Object, RowBounds, ResultHandler, CacheKey, BoundSql)} 操作前置处理
//     * <p>
//     * 改改sql啥的
//     *
//     * @param executor      Executor(可能是代理对象)
//     * @param ms            MappedStatement
//     * @param parameter     parameter
//     * @param rowBounds     rowBounds
//     * @param resultHandler resultHandler
//     * @param boundSql      boundSql
//     */
//    @Override
//    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
//
//
//        InnerInterceptor.super.beforeQuery(executor, ms, parameter, rowBounds, resultHandler, boundSql);
//    }
//
//    /**
//     * 判断是否执行 {@link Executor#update(MappedStatement, Object)}
//     * <p>
//     * 如果不执行update操作,则影响行数的值为 -1
//     *
//     * @param executor  Executor(可能是代理对象)
//     * @param ms        MappedStatement
//     * @param parameter parameter
//     */
//    @Override
//    public boolean willDoUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
//        return InnerInterceptor.super.willDoUpdate(executor, ms, parameter);
//    }
//
//    /**
//     * {@link Executor#update(MappedStatement, Object)} 操作前置处理
//     * <p>
//     * 改改sql啥的
//     *
//     * @param executor  Executor(可能是代理对象)
//     * @param ms        MappedStatement
//     * @param parameter parameter
//     */
//    @Override
//    public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
//        SqlCommandType sqlCommandType = ms.getSqlCommandType();
//        Object username = ThreadLocalUtil.getThreadLocal().get(Constants.USER_NAME);
//        if (username == null) {
//            username = "system";
//        }
//        if (SqlCommandType.INSERT.equals(sqlCommandType)) {
//            // 新增
//            for (Field f : parameter.getClass().getDeclaredFields()) {
//                f.setAccessible(true);
//                switch (f.getName()) {
//                    case "id":
//                        setPropertyValue(parameter, f, SnowflakeUtil.genId());
//                        break;
//                    case "createdBy":
//                    case "updatedBy":
//                        setPropertyValue(parameter, f, username);
//                        break;
//                    case "createdTime":
//                    case "updatedTime":
//                        Class<?> type1 = org.springframework.beans.BeanUtils.findPropertyType(f.getName(), parameter.getClass());
//                        if (LocalDateTime.class.getName().equals(type1.getName())) {
//                            setPropertyValue(parameter, f, LocalDateTime.now());
//                        } else {
//                            setPropertyValue(parameter, f, new Date());
//                        }
//                        break;
//                    case "deleted":
//                        setPropertyValue(parameter, f, "0");
//                        break;
//                }
//            }
//        } else if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
//            if (parameter.getClass().getName().equals(QueryWrapper.class)) {
//                try {
//                    QueryWrapper o = (QueryWrapper) parameter.getClass().newInstance();
//
//                } catch (InstantiationException e) {
//                    throw new RuntimeException(e);
//                } catch (IllegalAccessException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//
//            for (Field f : parameter.getClass().getDeclaredFields()) {
//                f.setAccessible(true);
//                switch (f.getName()) {
//                    case "updatedBy":
//                        setPropertyValue(parameter, f, username);
//                        break;
//                    case "updatedTime":
//                        Class<?> type2 = org.springframework.beans.BeanUtils.findPropertyType(f.getName(), parameter.getClass());
//                        if (LocalDateTime.class.getName().equals(type2.getName())) {
//                            setPropertyValue(parameter, f, LocalDateTime.now());
//                        } else {
//                            setPropertyValue(parameter, f, new Date());
//                        }
//                        break;
//                }
//            }
//        }
//    }
//
//    /**
//     * {@link StatementHandler#prepare(Connection, Integer)} 操作前置处理
//     * <p>
//     * 改改sql啥的
//     *
//     * @param sh                 StatementHandler(可能是代理对象)
//     * @param connection         Connection
//     * @param transactionTimeout transactionTimeout
//     */
//    @Override
//    public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
//        InnerInterceptor.super.beforePrepare(sh, connection, transactionTimeout);
//    }
//
//    /**
//     * {@link StatementHandler#getBoundSql()} 操作前置处理
//     * <p>
//     * 只有 {@link BatchExecutor} 和 {@link ReuseExecutor} 才会调用到这个方法
//     *
//     * @param sh StatementHandler(可能是代理对象)
//     */
//    @Override
//    public void beforeGetBoundSql(StatementHandler sh) {
//        InnerInterceptor.super.beforeGetBoundSql(sh);
//    }
//
//    @Override
//    public void setProperties(Properties properties) {
//        InnerInterceptor.super.setProperties(properties);
//    }
//
//    /**
//     * 获取对象的属性赋值
//     *
//     * @param bean
//     */
//    private String getPropertyValue(Object bean, String name) {
//        try {
//            //根据需要，将相关属性赋上默认值
//            return BeanUtils.getProperty(bean, name);
//        } catch (NoSuchMethodException e) {
//            logger.warn("获取属性值失败", e.getMessage());
//        } catch (InvocationTargetException e) {
//            logger.warn("获取属性值失败", e.getMessage());
//        } catch (IllegalAccessException e) {
//            logger.warn("获取属性值失败", e.getMessage());
//        }
//        return null;
//    }
//
//    /**
//     * 为对象的操作属性赋值
//     *
//     * @param parameter
//     * @param f
//     * @param val
//     */
//    private void setPropertyValue(Object parameter, Field f, Object val) {
//        if (StringUtils.isNotBlank(getPropertyValue(parameter, f.getName()))) {
//            return;
//        }
//        try {
//            //根据需要，将相关属性赋上默认值
//            BeanUtils.setProperty(parameter, f.getName(), val);
//        } catch (IllegalAccessException e) {
//            logger.warn("赋值失败", e.getMessage());
//        } catch (InvocationTargetException e) {
//            logger.warn("赋值失败", e.getMessage());
//        }
//    }
//}
